package com.share.device.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.share.device.domain.Cabinet;
import com.share.device.domain.Station;
import com.share.device.domain.StationLocation;
import com.share.device.mapper.StationMapper;
import com.share.device.repository.StationLocationRepository;
import com.share.device.service.ICabinetService;
import com.share.device.service.IRegionService;
import com.share.device.service.IStationService;
import org.bson.types.ObjectId;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.geo.GeoJsonPoint;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;

@Service
public class StationServiceImpl extends ServiceImpl<StationMapper, Station> implements IStationService
{
    @Autowired
    private StationMapper stationMapper;
    @Autowired
    private ICabinetService cabinetService;
    @Autowired
    private IRegionService regionService;


    @Autowired
    private StationLocationRepository stationLocationRepository;

    /**
     * 选择车站列表
     *
     * 此方法用于根据Station对象中的条件筛选出车站列表，并为每个车站对象补充对应的机柜编号信息
     *
     * @param station 包含筛选条件的车站对象，用于查询车站列表
     * @return 返回一个车站对象列表，每个车站对象都补充了机柜编号信息
     */
    @Override
    public List<Station> selectStationList(Station station)
    {
        // 查询符合条件的车站列表
        List<Station> list = stationMapper.selectStationList(station);

        // 提取车站列表中的机柜ID，并存储到列表中
        list.forEach(sta -> {
            //获取每个站点对象里面的机柜ID
            Long cabinetId = sta.getCabinetId();
            //根据柜机id获取对应机柜编号
            Cabinet cabinet = cabinetService.getById(cabinetId);
            String cabinetNo = cabinet.getCabinetNo();
            // 将机柜编号添加到列表中
            sta.setCabinetNo(cabinetNo);
        });


        // 返回补充了机柜编号信息的车站列表
        return list;
    }

    /**
     * 新增站点
     *
     * 此方法用于保存站点信息，并返回保存结果。
     *
     * @param station 要保存的站点对象
     * @return 返回保存结果，如果保存成功则返回1，否则返回0
     */
    @Override
    public int saveStation(Station station) {
        // 根据省编码获取省名
        String provinceName = regionService.getNameByCode(station.getProvinceCode());
        // 根据市编码获取市名
        String cityName = regionService.getNameByCode(station.getCityCode());
        // 根据区编码获取区名
        String districtName = regionService.getNameByCode(station.getDistrictCode());

        // 拼接完整地址
        station.setFullAddress(provinceName + cityName + districtName + station.getAddress());

        // 调用Mapper接口插入站点信息
        int insert = stationMapper.insert(station);

        StationLocation stationLocation = new StationLocation();
        stationLocation.setId(ObjectId.get().toString());
        stationLocation.setStationId(station.getId());
        stationLocation.setLocation(new GeoJsonPoint(station.getLongitude().doubleValue(), station.getLatitude().doubleValue()));
        stationLocation.setCreateTime(new Date());

        stationLocationRepository.save(stationLocation);

        // 返回插入结果
        return insert;
    }



    /**
     * 更新站点
     *
     * 此方法用于更新站点信息，并返回更新结果。
     * 它首先通过地区代码获取对应的省、市、区名称，然后组合成完整的地址，
     * 最后调用数据访问层的方法更新站点信息。
     *
     * @param station 要更新的站点对象
     * @return 返回更新结果，如果更新成功则返回1，否则返回0
     */
    @Override
    public int updateStation(Station station) {
        // 根据省代码获取省名
        String provinceName = regionService.getNameByCode(station.getProvinceCode());
        // 根据市代码获取市名
        String cityName = regionService.getNameByCode(station.getCityCode());
        // 根据区代码获取区名
        String districtName = regionService.getNameByCode(station.getDistrictCode());

        // 拼接完整地址
        station.setFullAddress(provinceName + cityName + districtName + station.getAddress());

        // 调用数据访问层方法更新站点信息
        int update = stationMapper.updateById(station);


        //同步站点位置信息到MongoDB
        StationLocation stationLocation = stationLocationRepository.getByStationId(station.getId());
        stationLocation.setLocation(new GeoJsonPoint(station.getLongitude().doubleValue(), station.getLatitude().doubleValue()));
        stationLocationRepository.save(stationLocation);


        // 返回更新结果
        return update;
    }


    /**
     * 更新数据方法，主要用于确保每个站点都有对应的站点位置信息
     * 如果站点位置信息不存在，则创建并保存新的站点位置信息
     */
    @Override
    public void updateData() {
        // 获取站点列表
        List<Station> stationList = this.list();
        // 遍历站点列表
        for (Station station : stationList) {
            // 根据站点ID获取站点位置信息
            StationLocation stationLocation = stationLocationRepository.getByStationId(station.getId());
            // 如果站点位置信息不存在
            if(stationLocation == null) {
                // 创建新的站点位置信息对象
                stationLocation = new StationLocation();
                // 设置站点位置信息的ID
                stationLocation.setId(ObjectId.get().toString());
                // 设置站点位置信息的站点ID
                stationLocation.setStationId(station.getId());
                // 创建并设置站点位置信息的地理位置（经纬度）
                stationLocation.setLocation(new GeoJsonPoint(station.getLongitude().doubleValue(), station.getLatitude().doubleValue()));
                // 设置站点位置信息的创建时间
                stationLocation.setCreateTime(new Date());
                // 保存新的站点位置信息到数据库
                stationLocationRepository.save(stationLocation);
            }
        }
    }


}